//===-- DWARFDefines.h ------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef SymbolFileDWARF_DWARFDefines_h_
#define SymbolFileDWARF_DWARFDefines_h_

#include <stdint.h>
#include <stdbool.h>
#include "lldb/Core/dwarf.h"

namespace lldb_private {

typedef uint32_t DRC_class;          // Holds DRC_* class bitfields

enum DW_TAG_Category
{
    TagCategoryVariable,
    TagCategoryType,
    TagCategoryProgram,
    kNumTagCategories
};

typedef enum DW_TAG_Category DW_TAG_CategoryEnum;

const char *DW_TAG_value_to_name (uint32_t val);

DW_TAG_CategoryEnum get_tag_category (uint16_t tag);

const char *DW_CHILDREN_value_to_name (uint8_t val);

const char *DW_AT_value_to_name (uint32_t val);

const char *DW_FORM_value_to_name (uint32_t val);

const char *DW_OP_value_to_name (uint32_t val);

DRC_class DW_OP_value_to_class (uint32_t val);

const char *DW_ATE_value_to_name (uint32_t val);

const char *DW_ACCESS_value_to_name (uint32_t val);

const char *DW_VIS_value_to_name (uint32_t val);

const char *DW_VIRTUALITY_value_to_name (uint32_t val);

const char *DW_LANG_value_to_name (uint32_t val);

const char *DW_ID_value_to_name (uint32_t val);

const char *DW_CC_value_to_name (uint32_t val);

const char *DW_INL_value_to_name (uint32_t val);

const char *DW_ORD_value_to_name (uint32_t val);

const char *DW_DSC_value_to_name (uint32_t val);

const char *DW_LNS_value_to_name (uint32_t val);

const char *DW_LNE_value_to_name (uint32_t val);

const char *DW_MACINFO_value_to_name (uint32_t val);

const char *DW_CFA_value_to_name (uint32_t val);

const char *DW_GNU_EH_PE_value_to_name (uint32_t val);

/* These DRC are entirely our own construction,
    although they are derived from various comments in the DWARF standard.
    Most of these are not useful to the parser, but the DW_AT and DW_FORM
    classes should prove to be usable in some fashion.  */

#define DRC_0x65                               0x1
#define DRC_ADDRESS                            0x2
#define DRC_BLOCK                              0x4
#define DRC_CONSTANT                           0x8
#define DRC_DWARFv3                           0x10
#define DRC_FLAG                              0x20
#define DRC_INDIRECT_SPECIAL                  0x40
#define DRC_LINEPTR                           0x80
#define DRC_LOCEXPR                          0x100
#define DRC_LOCLISTPTR                       0x200
#define DRC_MACPTR                           0x400
#define DRC_ONEOPERAND                       0x800
#define DRC_OPERANDONE_1BYTE_DELTA          0x1000
#define DRC_OPERANDONE_2BYTE_DELTA          0x2000
#define DRC_OPERANDONE_4BYTE_DELTA          0x4000
#define DRC_OPERANDONE_ADDRESS              0x8000
#define DRC_OPERANDONE_BLOCK               0x10000
#define DRC_OPERANDONE_SLEB128_OFFSET      0x20000
#define DRC_OPERANDONE_ULEB128_OFFSET      0x40000
#define DRC_OPERANDONE_ULEB128_REGISTER    0x80000
#define DRC_OPERANDTWO_BLOCK              0x100000
#define DRC_OPERANDTWO_SLEB128_OFFSET     0x200000
#define DRC_OPERANDTWO_ULEB128_OFFSET     0x400000
#define DRC_OPERANDTWO_ULEB128_REGISTER   0x800000
#define DRC_OPERNADONE_ULEB128_REGISTER  0x1000000
#define DRC_RANGELISTPTR                 0x2000000
#define DRC_REFERENCE                    0x4000000
#define DRC_STRING                       0x8000000
#define DRC_TWOOPERANDS                 0x10000000
#define DRC_VENDOR_GNU                  0x20000000
#define DRC_VENDOR_MIPS                 0x40000000
#define DRC_ZEROOPERANDS                0x80000000

} // namespace lldb_private


#endif  // SymbolFileDWARF_DWARFDefines_h_
